"""
知识库搜索工具

仅提供语义搜索功能
"""

from langchain_core.tools import tool
from typing import Dict
from module.knowledge_base import get_kb_manager
from config.config import KB_ENABLED
from .sse_helper import send_sse_event


def _send_search_results_to_frontend(data: dict):
    """发送知识库搜索结果给前端（通过 SSE 事件）"""
    send_sse_event("knowledge_search", data, tag="knowledge_search")


@tool
def search_knowledge_base(query: str, max_results: int = 5) -> Dict:
    """
    在知识库中进行语义相似性搜索

    支持自然语言查询，根据语义相似性从知识库中检索相关文档。
    返回结果包括文档内容、相似度分数、来源和元数据。

    Args:
        query: 查询文本（支持中文自然语言），例如"设备故障表现为离线怎么处理？"
        max_results: 返回的最大结果数（1-20），默认5

    Returns:
        包含以下字段的字典：
        - query: 原始查询文本
        - total_results: 返回的结果数
        - results: 结果列表，每个结果包含：
            - content: 文档内容
            - similarity: 相似度分数（0-1，越接近1越相似）
            - source: 文档来源
            - doc_type: 文档类型
            - created_at: 文档创建时间
            - metadata: 其他元数据

    Examples:
        查询: "设备如何处理离线问题？"
        返回示例：
        {
            "query": "设备如何处理离线问题？",
            "total_results": 2,
            "results": [
                {
                    "content": "设备离线解决方案：重启设备...",
                    "similarity": 0.8562,
                    "source": "工单系统-WO-2024-001",
                    "doc_type": "workorder",
                    "created_at": "2024-01-15T10:30:00",
                    "metadata": {"device_id": "D001"}
                }
            ]
        }
    """
    if not KB_ENABLED:
        result = {"error": "❌ 知识库功能已禁用"}
        _send_search_results_to_frontend(result)
        return result

    if not query or not query.strip():
        result = {"error": "❌ 查询文本不能为空"}
        _send_search_results_to_frontend(result)
        return result

    kb = get_kb_manager()
    if kb is None or kb.vectorstore is None:
        result = {
            "error": "❌ 知识库未初始化或为空，请先添加文档",
            "query": query,
            "total_results": 0,
            "results": [],
        }
        _send_search_results_to_frontend(result)
        return result

    results = kb.search_similar(query, k=min(max_results, 20), score_threshold=0.3)

    result = {
        "query": query,
        "total_results": len(results),
        "results": results,
    }
    _send_search_results_to_frontend(result)
    return result


# 工具列表（仅包含搜索工具）
KnowledgeBaseSearchTool = [search_knowledge_base]




